package controller

import (
	"fmt"
	"sort"
	"subtitleAnalyser/model"
)

// @Title  pan
// @Description  字幕平移
// @Author  chen（陈锴）
// @Update  chen（陈锴）  2023-12-24
// @Reture subtitles reerrors
func Pan(time int, subtitles model.Subtitles) (resubtitles model.Subtitles, reerrors []string) {
	// 错误数组
	errors := make([]string, 0)
	// 更新数组
	newsubtitles := make([]model.Subtitle, 0)

	for i := range subtitles {
		// 如果是损坏文件
		if subtitles[i].Id == -1 {
			continue
		}
		// 平移前时间数据损坏
		if _, ok := interface{}(subtitles[i].StartTime).(int); !ok || subtitles[i].StartTime < 0 {
			message := fmt.Sprintf("字幕元素第 %d 个：开始时间类型错误或超过阈值", i)
			errors = append(errors, message)
			// 标记为损坏
			subtitles[i].Id = -1
			continue
		}
		if _, ok := interface{}(subtitles[i].EndTime).(int); !ok || subtitles[i].EndTime < 0 {
			message := fmt.Sprintf("字幕元素第 %d 个：结束时间类型错误或超过阈值", i)
			errors = append(errors, message)
			// 标记为损坏
			subtitles[i].Id = -1
			continue
		}


		// 平移后时间为负数
		if subtitles[i].StartTime + time < 0 {
			message := fmt.Sprintf("字幕元素第 %d 个：平移后开始时间超过阈值，start time + time < 0", i)
			errors = append(errors, message)
			continue
		}
		if subtitles[i].EndTime + time < 0 {
			message := fmt.Sprintf("字幕元素第 %d 个：平移后开始时间超过阈值，end time + time < 0", i)
			errors = append(errors, message)
			continue
		}

		// 平移
		subtitles[i].StartTime = subtitles[i].StartTime + time
		subtitles[i].EndTime = subtitles[i].EndTime + time
		// 加入更新数组
		newsubtitles = append(newsubtitles, subtitles[i])
	}

	// 排序
	sort.Sort(model.Subtitles(newsubtitles))

	// 字幕去重
	for i := 1; i < len(newsubtitles); i++ {
		if newsubtitles[i - 1].EndTime <= newsubtitles[i].StartTime {
			continue
		}
		// 时间压缩
		newsubtitles[i - 1].EndTime = newsubtitles[i].StartTime
	}

	resubtitles = newsubtitles
	reerrors = errors
	return
}